RESTful 路由
官方文档中不用看的内容。
只学: resources :xx 就足够了。
了解一些: namespace. 了解一些: match 了解一些: get ... to 就够了。
其他的都不用看。 非资源式路由。 定制资源式路由,不用看。
我们在项目中, 不用那些稀奇古怪的知识。
学习的目标
看到 resources, 能瞬间人肉算出它生成的7中路由, 能瞬间 说出某个路由对应的action。
下面是大师的讲解。
就是使用不同的请求类型, 来获取各种资源。
POST: create, (创建资源)
PUT/PATCH: update, (更新)
GET: index, show, new, edit, (只读取数据,不修改数据)
DELETE: destroy (删除)
所以, 在RESTful中,不同的http request类型,就决定了你是要对数据库进行 什么操作(增,删,改,还是只读?)
至于rails, 是如何实现对RESTful进行解析的呢?
极其简单:
config/routes.rb中:
resources :users
(注意: 不是 resource ) 上面一句,就直接定义了7种路由:
GET /users index 显示 user的列表页
GET /users/new new 显示 user的新建页面。
GET /users/3 show 显示id是3的user
GET /users/3/edit edit 显示 user(id =3)的编辑页面。
PUT /users/3 update 对id = 3的user进行修改 (后面还会紧跟一大串的参数)
POST /users create 对users进行创建(后面也有一大堆参数)
DELETE /users/3 destroy 对 id=3的 user 进行删除操作。
(可以使用 $ rake routes 就可以查看当前项目中所有的路由)
这就是一种: convention(约定) over configuration (配置)
Rails中的各种 _path, _url 的来历
下面的代码, 来自某个项目中的命令: $ rake routes
:
POST /travels(.:format) travels#create
new_travel GET /travels/new(.:format) travels#new
edit_travel GET /travels/:id/edit(.:format) travels#edit
travel GET /travels/:id(.:format) travels#show
PATCH /travels/:id(.:format) travels#update
PUT /travels/:id(.:format) travels#update
DELETE /travels/:id(.:format) travels#destroy
我把它整理一下,大家就知道内容是什么了:
url 的名字 | REST方法 | 对应的url 的表达式 | 对应的 controller#action |
---|---|---|---|
travels_path | POST | /travels(.:format) | travels#create |
new_travel_path | GET | /travels/new(.:format) | travels#new |
edit_travel_path | GET | /travels/:id/edit(.:format) | travels#edit |
travel_path | GET | /travels/:id(.:format) | travels#show |
travel_path | PATCH | /travels/:id(.:format) | travels#update |
travel_path | PUT | /travels/:id(.:format) | travels#update |
travel_path | DELETE | /travels/:id(.:format) | travels#destroy |
所以, 看到第一列了吗? 大家见到的 xx_path
, xx_url
就是从这里来的. 另外, travel_path
等同于travel_url
.
edit_user_path @user 是什么东东?
如何编辑某个user?
"/users/1/edit"
写成ruby代码:
- "/users/" + user.id + "/edit"
- "/users/#{user.id}/edit" # string interpolation 插入插值
实际上上面这两种形式,都是外行的风格(比如,之前做java 的同学, 来写ruby , 就是这个风格)
下面是 Rails风格(把可读性发挥到极致)的写法:
最初的形式:
<%= edit_user_url({:id => User.first.id}) %>
然后,ruby的最外层的方法调用的 ()可以省略:
<%= edit_user_url {:id => User.first.id} %> <br/>
ruby的最外层的 hash的 {} 可以省略:
<%= edit_user_url :id => User.first.id %> <br/>
对于rails来说,每个数据库的对象,转换成 string interpolation 的时候,都是默认调用 id方法。
所以,一个默认的model 当它 to_string的时候, 是要返回 id 的.
所以,最终,也就有了这样的写法:
<%= edit_user_url User.first %>
==== 有空使劲看: http://guides.rubyonrails.org/routing.html 有 各种 _url, _path 的来历和用法.
resources :countries do resources :provinces do resources :cities do resources :districts do ... end end end end